Micron Document
C.S.Burner 🪙 ━►🔥GIT Node

Node / reticulum_mirror / MeshChatX / files / meshchatx / src / backend / map_data_manager.py

Displaying Raw • Download

meshchatx/src/backend/map_data_manager.py master (f0f6ed57) Text, 30.01 KB

T8b949e# SPDX-License-Identifier: 0BSD

T8b949e"""Publish and fetch map packs over aspect map-data-v1."""

Tff7b72from T7ee787__future__ Tff7b72import Te6edf3annotations

Tff7b72import T7ee787asyncio
Tff7b72import T7ee787hashlib
Tff7b72import T7ee787json
Tff7b72import T7ee787logging
Tff7b72import T7ee787os
Tff7b72import T7ee787re
Tff7b72import T7ee787stat
Tff7b72import T7ee787threading
Tff7b72import T7ee787uuid
Tff7b72from T7ee787contextlib Tff7b72import Te6edf3suppress
Tff7b72from T7ee787typing Tff7b72import Te6edf3Any

Tff7b72import T7ee787RNS

Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787map_geo_sanitizer Tff7b72import Te6edf3sanitize_geo_bytes
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787map_geo_validator Tff7b72import Tb4b4b4(
Te6edf3GeoValidationErrorTb4b4b4,
Te6edf3validate_geo_bytesTb4b4b4,
Tb4b4b4)
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787map_overlay_manager Tff7b72import Tb4b4b4(
Te6edf3atomic_write_bytesTb4b4b4,
Te6edf3clamp_overlay_config_valueTb4b4b4,
Te6edf3read_regular_file_bytesTb4b4b4,
Tb4b4b4)
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787map_overlay_sources Tff7b72import Tb4b4b4(
Te6edf3ALLOWED_OVERLAY_FORMATSTb4b4b4,
Te6edf3KIND_MAP_DATATb4b4b4,
Tb4b4b4)
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787path_utils Tff7b72import Te6edf3path_response_window
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787path_utils Tff7b72import Te6edf3is_path_within_dir

Te6edf3_log Tff7b72= Te6edf3loggingTff7b72.Td2a8ffgetLoggerTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.map_dataTa5d6ff"Tb4b4b4)

Te6edf3MAP_ASPECT Tff7b72= Ta5d6ff"Ta5d6ffmap-data-v1Ta5d6ff"
Te6edf3CATALOG_PATH Tff7b72= Ta5d6ff"Ta5d6ff/catalogTa5d6ff"
Te6edf3MAP_PATH_PREFIX Tff7b72= Ta5d6ff"Ta5d6ff/map/Ta5d6ff"
Te6edf3MAP_ID_RE Tff7b72= Te6edf3reTff7b72.Td2a8ffcompileTb4b4b4(Ta5d6ffrTa5d6ff"Ta5d6ff^[0-9a-f]Tffd700{16}Ta5d6ff$Ta5d6ff"Tb4b4b4)
Te6edf3_SHA256_RE Tff7b72= Te6edf3reTff7b72.Td2a8ffcompileTb4b4b4(Ta5d6ffrTa5d6ff"Ta5d6ff^[0-9a-f]Tffd700{64}Ta5d6ff$Ta5d6ff"Tb4b4b4)
Te6edf3DISPLAY_NAME_MAX Tff7b72= T79c0ff32
Te6edf3DEFAULT_MAX_BYTES Tff7b72= T79c0ff512 Tff7b72* T79c0ff1024
Te6edf3MIN_ANNOUNCE_INTERVAL Tff7b72= T79c0ff10
Te6edf3DEFAULT_ANNOUNCE_INTERVAL Tff7b72= T79c0ff900
Te6edf3MAX_ANNOUNCE_INTERVAL Tff7b72= T79c0ff86400
Te6edf3MAX_PUBLISHED_MAPS Tff7b72= T79c0ff64
Te6edf3MAX_CATALOG_BYTES Tff7b72= T79c0ff256 Tff7b72* T79c0ff1024
Te6edf3MAX_COERCE_DEPTH Tff7b72= T79c0ff2


Tff7b72class T56d364MapDataErrorTb4b4b4(Tf85149ValueErrorTb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3codeTb4b4b4: Tffa657strTb4b4b4, Te6edf3messageTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcode Tff7b72= Te6edf3code
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Te6edf3message Tff7b72or Te6edf3codeTb4b4b4)


Tff7b72def Td2a8ffcoerce_map_request_bodyTb4b4b4(Te6edf3payloadTb4b4b4, Tff7b72*Tb4b4b4, Te6edf3_depthTb4b4b4: Tffa657int Tff7b72= T79c0ff0Tb4b4b4) Tff7b72-Tff7b72> Tffa657bytesTb4b4b4:
T8b949e"""Turn an RNS request receipt payload into raw bytes.

Catalog handlers return bytes. A list of [bytes, metadata] is the file
response shape, but RNS only treats index 0 as a file when it is a
BufferedReader. Bytes in a list must be unwrapped here.
"""
Tff7b72if Te6edf3_depth Tff7b72> Te6edf3MAX_COERCE_DEPTHTb4b4b4:
Tff7b72raise Te6edf3MapDataErrorTb4b4b4(Ta5d6ff"Ta5d6ffinvalid_responseTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3payload Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72raise Te6edf3MapDataErrorTb4b4b4(Ta5d6ff"Ta5d6ffempty_responseTa5d6ff"Tb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3payloadTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4, Tffa657memoryviewTb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72return Tffa657bytesTb4b4b4(Te6edf3payloadTb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3payloadTb4b4b4, Tffa657strTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3payloadTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Te6edf3reader Tff7b72= Tffa657getattrTb4b4b4(Te6edf3payloadTb4b4b4, Ta5d6ff"Ta5d6ffreadTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72if Tffa657callableTb4b4b4(Te6edf3readerTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3coerce_map_request_bodyTb4b4b4(Te6edf3readerTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3_depthTff7b72=Te6edf3_depth Tff7b72+ T79c0ff1Tb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3payloadTb4b4b4, Tb4b4b4(Tffa657listTb4b4b4, Tffa657tupleTb4b4b4)Tb4b4b4) Tff7b72and Te6edf3payloadTb4b4b4:
Tff7b72return Te6edf3coerce_map_request_bodyTb4b4b4(Te6edf3payloadTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4, Te6edf3_depthTff7b72=Te6edf3_depth Tff7b72+ T79c0ff1Tb4b4b4)
Tff7b72raise Te6edf3MapDataErrorTb4b4b4(Ta5d6ff"Ta5d6ffinvalid_responseTa5d6ff"Tb4b4b4)


Tff7b72def Td2a8ffparse_map_data_app_dataTb4b4b4(Te6edf3app_dataTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3app_dataTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffvTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4, Ta5d6ff"Ta5d6ffnTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4}
Te6edf3raw Tff7b72= Te6edf3app_data
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3rawTb4b4b4, Tffa657strTb4b4b4)Tb4b4b4:
Te6edf3raw Tff7b72= Te6edf3rawTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4, Te6edf3errorsTff7b72=Ta5d6ff"Ta5d6ffreplaceTa5d6ff"Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3obj Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Tffa657bytesTb4b4b4(Te6edf3rawTb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3objTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Te6edf3name Tff7b72= Tffa657strTb4b4b4(Te6edf3objTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffnTa5d6ff"Tb4b4b4) Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4[Tb4b4b4:Te6edf3DISPLAY_NAME_MAXTb4b4b4]
Tff7b72tryTb4b4b4:
Te6edf3count Tff7b72= Tffa657intTb4b4b4(Te6edf3objTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffcTa5d6ff"Tb4b4b4) Tff7b72or T79c0ff0Tb4b4b4)
Tff7b72except Tb4b4b4(Tf85149TypeErrorTb4b4b4, Tf85149ValueErrorTb4b4b4)Tb4b4b4:
Te6edf3count Tff7b72= T79c0ff0
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffvTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4, Ta5d6ff"Ta5d6ffnTa5d6ff"Tb4b4b4: Te6edf3nameTb4b4b4, Ta5d6ff"Ta5d6ffcTa5d6ff"Tb4b4b4: Tffa657maxTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3countTb4b4b4)Tb4b4b4}
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
Te6edf3name Tff7b72= Tffa657bytesTb4b4b4(Te6edf3rawTb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4, Te6edf3errorsTff7b72=Ta5d6ff"Ta5d6ffreplaceTa5d6ff"Tb4b4b4)Tb4b4b4[Tb4b4b4:Te6edf3DISPLAY_NAME_MAXTb4b4b4]
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffvTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4, Ta5d6ff"Ta5d6ffnTa5d6ff"Tb4b4b4: Te6edf3nameTb4b4b4, Ta5d6ff"Ta5d6ffcTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4}


Tff7b72def Td2a8ffclamp_announce_intervalTb4b4b4(
Te6edf3valueTb4b4b4: Te6edf3AnyTb4b4b4, Te6edf3defaultTb4b4b4: Tffa657int Tff7b72= Te6edf3DEFAULT_ANNOUNCE_INTERVAL
Tb4b4b4) Tff7b72-Tff7b72> Tffa657intTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3seconds Tff7b72= Tffa657intTb4b4b4(Te6edf3valueTb4b4b4)
Tff7b72except Tb4b4b4(Tf85149TypeErrorTb4b4b4, Tf85149ValueErrorTb4b4b4)Tb4b4b4:
Tff7b72return Tffa657intTb4b4b4(Te6edf3defaultTb4b4b4)
Tff7b72if Te6edf3seconds Tff7b72<Tff7b72= T79c0ff0Tb4b4b4:
Tff7b72return T79c0ff0
Tff7b72return Tffa657maxTb4b4b4(Te6edf3MIN_ANNOUNCE_INTERVALTb4b4b4, Tffa657minTb4b4b4(Te6edf3MAX_ANNOUNCE_INTERVALTb4b4b4, Te6edf3secondsTb4b4b4)Tb4b4b4)


Tff7b72class T56d364MapDataManagerTb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3configTb4b4b4,
Te6edf3databaseTb4b4b4,
Te6edf3storage_dirTb4b4b4: Tffa657strTb4b4b4,
Te6edf3identityTb4b4b4,
Tff7b72*Tb4b4b4,
Te6edf3reticulumTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3link_manager_getterTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3overlay_manager_getterTff7b72=Tff7b72NoneTb4b4b4,
Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfig Tff7b72= Te6edf3config
Tff7b72selfTff7b72.Td2a8ffdatabase Tff7b72= Te6edf3database
Tff7b72selfTff7b72.Td2a8ffstorage_dir Tff7b72= Te6edf3storage_dir
Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72= Te6edf3identity
Tff7b72selfTff7b72.Td2a8ffreticulum Tff7b72= Te6edf3reticulum
Tff7b72selfTff7b72.Td2a8ff_link_manager_getter Tff7b72= Te6edf3link_manager_getter
Tff7b72selfTff7b72.Td2a8ff_overlay_manager_getter Tff7b72= Te6edf3overlay_manager_getter
Tff7b72selfTff7b72.Td2a8ff_lock Tff7b72= Te6edf3threadingTff7b72.Td2a8ffRLockTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_destinationTb4b4b4: Te6edf3RNSTff7b72.Td2a8ffDestination Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_announce_timer Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_registered_map_pathsTb4b4b4: Tffa657setTb4b4b4[Tffa657strTb4b4b4] Tff7b72= Tffa657setTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_running Tff7b72= Tff7b72False

Tff7b72def Td2a8ffidentity_hashTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffdata_rootTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Te6edf3path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstorage_dirTb4b4b4, Ta5d6ff"Ta5d6ffmap_dataTa5d6ff"Tb4b4b4)
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3pathTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72return Te6edf3path

Tff7b72def Td2a8ff_cfg_max_bytesTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657intTb4b4b4:
Te6edf3overlay_max Tff7b72= Te6edf3clamp_overlay_config_valueTb4b4b4(
Ta5d6ff"Ta5d6ffmap_overlay_max_bytesTa5d6ff"Tb4b4b4,
Tffa657intTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigTff7b72.Td2a8ffmap_overlay_max_bytesTff7b72.Td2a8ffgetTb4b4b4(Tb4b4b4) Tff7b72or Tb4b4b4(T79c0ff8 Tff7b72* T79c0ff1024 Tff7b72* T79c0ff1024Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3raw Tff7b72= Tffa657getattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4, Ta5d6ff"Ta5d6ffmap_data_max_bytesTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72if Te6edf3raw Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3wanted Tff7b72= Te6edf3DEFAULT_MAX_BYTES
Tff7b72elseTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3wanted Tff7b72= Tffa657intTb4b4b4(Te6edf3rawTff7b72.Td2a8ffgetTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72except Tb4b4b4(Tf85149TypeErrorTb4b4b4, Tf85149ValueErrorTb4b4b4)Tb4b4b4:
Te6edf3wanted Tff7b72= Te6edf3DEFAULT_MAX_BYTES
Tff7b72if Te6edf3wanted Tff7b72<Tff7b72= T79c0ff0Tb4b4b4:
Te6edf3wanted Tff7b72= Te6edf3DEFAULT_MAX_BYTES
Tff7b72return Tffa657maxTb4b4b4(T79c0ff64 Tff7b72* T79c0ff1024Tb4b4b4, Tffa657minTb4b4b4(Te6edf3overlay_maxTb4b4b4, Te6edf3wantedTb4b4b4)Tb4b4b4)

Tff7b72def Td2a8ff_cfg_timeoutTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3keyTb4b4b4: Tffa657strTb4b4b4, Te6edf3defaultTb4b4b4: Tffa657intTb4b4b4) Tff7b72-Tff7b72> Tffa657intTb4b4b4:
Te6edf3raw Tff7b72= Tffa657getattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4, Te6edf3keyTb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3value Tff7b72= Te6edf3default Tff7b72if Te6edf3raw Tff7b72is Tff7b72None Tff7b72else Tffa657intTb4b4b4(Te6edf3rawTff7b72.Td2a8ffgetTb4b4b4(Tb4b4b4) Tff7b72or Te6edf3defaultTb4b4b4)
Tff7b72except Tb4b4b4(Tf85149TypeErrorTb4b4b4, Tf85149ValueErrorTb4b4b4)Tb4b4b4:
Te6edf3value Tff7b72= Te6edf3default
Tff7b72return Te6edf3clamp_overlay_config_valueTb4b4b4(Te6edf3keyTb4b4b4, Te6edf3valueTb4b4b4)

Tff7b72def Td2a8ff_resolve_published_fileTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3map_idTb4b4b4: Tffa657strTb4b4b4, Te6edf3relTb4b4b4: Tffa657str Tff7b72| Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tffa657str Tff7b72| Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Te6edf3MAP_ID_RETff7b72.Td2a8fffullmatchTb4b4b4(Te6edf3map_id Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72None
Te6edf3base Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffbasenameTb4b4b4(Tffa657strTb4b4b4(Te6edf3rel Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Tffea00\\Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3base Tff7b72or Ta5d6ff"Tffea00\x00Ta5d6ff" Tff7b72in Te6edf3baseTb4b4b4:
Tff7b72return Tff7b72None
Te6edf3nameTb4b4b4, Te6edf3ext Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffsplitextTb4b4b4(Te6edf3baseTb4b4b4)
Te6edf3fmt Tff7b72= Te6edf3extTff7b72.Td2a8fflstripTb4b4b4(Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3name Tff7b72!= Te6edf3map_id Tff7b72or Te6edf3fmt Tff7b72not Tff7b72in Te6edf3ALLOWED_OVERLAY_FORMATSTb4b4b4:
Tff7b72return Tff7b72None
Te6edf3root Tff7b72= Tff7b72selfTff7b72.Td2a8ffdata_rootTb4b4b4(Tb4b4b4)
Te6edf3abs_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3rootTb4b4b4, Te6edf3baseTb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3st Tff7b72= Te6edf3osTff7b72.Td2a8fflstatTb4b4b4(Te6edf3abs_pathTb4b4b4)
Tff7b72except Tf85149OSErrorTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72if Te6edf3statTff7b72.Td2a8ffS_ISLNKTb4b4b4(Te6edf3stTff7b72.Td2a8ffst_modeTb4b4b4) Tff7b72or Tff7b72not Te6edf3statTff7b72.Td2a8ffS_ISREGTb4b4b4(Te6edf3stTff7b72.Td2a8ffst_modeTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72None
Tff7b72if Tff7b72not Te6edf3is_path_within_dirTb4b4b4(Te6edf3abs_pathTb4b4b4, Te6edf3rootTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72None
Tff7b72return Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffrealpathTb4b4b4(Te6edf3abs_pathTb4b4b4)

Tff7b72def Td2a8ff_display_nameTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Te6edf3raw Tff7b72= Tffa657getattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4, Ta5d6ff"Ta5d6ffmap_data_display_nameTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)
Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72if Te6edf3raw Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3name Tff7b72= Tffa657strTb4b4b4(Te6edf3rawTff7b72.Td2a8ffgetTb4b4b4(Tb4b4b4) Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3nameTb4b4b4:
Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffMapsTa5d6ff"
Tff7b72return Te6edf3nameTb4b4b4[Tb4b4b4:Te6edf3DISPLAY_NAME_MAXTb4b4b4]

Tff7b72def Td2a8ff_announce_enabledTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Te6edf3raw Tff7b72= Tffa657getattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4, Ta5d6ff"Ta5d6ffmap_data_announce_enabledTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72if Te6edf3raw Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72return Tffa657boolTb4b4b4(Te6edf3rawTff7b72.Td2a8ffgetTb4b4b4(Tb4b4b4)Tb4b4b4)

Tff7b72def Td2a8ff_published_countTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657intTb4b4b4:
Tff7b72return Tffa657intTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffmap_publishedTff7b72.Td2a8ffcount_for_identityTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentity_hashTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72or T79c0ff0
Tb4b4b4)

Tff7b72def Td2a8ff_should_announceTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_announce_enabledTb4b4b4(Tb4b4b4) Tff7b72and Tff7b72selfTff7b72.Td2a8ff_published_countTb4b4b4(Tb4b4b4) Tff7b72> T79c0ff0

Tff7b72def Td2a8ff_is_local_hashTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3destTb4b4b4: Tffa657bytesTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Te6edf3current Tff7b72= Tff7b72selfTff7b72.Td2a8ff_destination
Tff7b72return Te6edf3current Tff7b72is Tff7b72not Tff7b72None Tff7b72and Te6edf3currentTff7b72.Td2a8ffhash Tff7b72== Te6edf3dest

Tff7b72def Td2a8ff_announce_intervalTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657intTb4b4b4:
Te6edf3raw Tff7b72= Tffa657getattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4, Ta5d6ff"Ta5d6ffmap_data_announce_intervalTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)
Te6edf3value Tff7b72= Te6edf3DEFAULT_ANNOUNCE_INTERVAL Tff7b72if Te6edf3raw Tff7b72is Tff7b72None Tff7b72else Te6edf3rawTff7b72.Td2a8ffgetTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3clamp_announce_intervalTb4b4b4(Te6edf3valueTb4b4b4)

Tff7b72def Td2a8ffstatusTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Te6edf3dest Tff7b72= Tff7b72selfTff7b72.Td2a8ff_destination
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6ffaspectTa5d6ff"Tb4b4b4: Te6edf3MAP_ASPECTTb4b4b4,
Ta5d6ff"Ta5d6ffrunningTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_running Tff7b72and Te6edf3dest Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4: Te6edf3destTff7b72.Td2a8ffhashTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4) Tff7b72if Te6edf3dest Tff7b72is Tff7b72not Tff7b72None Tff7b72else Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6ffdisplay_nameTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_display_nameTb4b4b4(Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffannounce_enabledTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_announce_enabledTb4b4b4(Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffannounce_intervalTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_announce_intervalTb4b4b4(Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffmax_bytesTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_cfg_max_bytesTb4b4b4(Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffpublished_countTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_published_countTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4}

Tff7b72def Td2a8ffstartTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_running Tff7b72= Tff7b72True
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_published_countTb4b4b4(Tb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_ensure_destination_lockedTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_should_announceTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_announce_lockedTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_sync_announce_timerTb4b4b4(Tb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ffstatusTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffstopTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_running Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ff_teardown_destination_lockedTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ff_ensure_destination_lockedTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_destination Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_register_all_handlersTb4b4b4(Tb4b4b4)
Tff7b72return
Te6edf3app_nameTb4b4b4, Te6edf3aspects Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffapp_and_aspects_from_nameTb4b4b4(Te6edf3MAP_ASPECTTb4b4b4)
Te6edf3destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffidentityTb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffINTb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4,
Te6edf3app_nameTb4b4b4,
Tff7b72*Te6edf3aspectsTb4b4b4,
Tb4b4b4)
Te6edf3destinationTff7b72.Td2a8ffset_link_established_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_on_linkTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_destination Tff7b72= Te6edf3destination
Tff7b72selfTff7b72.Td2a8ff_register_all_handlersTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ff_teardown_destination_lockedTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_cancel_announce_timerTb4b4b4(Tb4b4b4)
Te6edf3dest Tff7b72= Tff7b72selfTff7b72.Td2a8ff_destination
Tff7b72selfTff7b72.Td2a8ff_destination Tff7b72= Tff7b72None
Tff7b72if Te6edf3dest Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return
Tff7b72for Te6edf3path Tff7b72in Tffa657listTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_registered_map_pathsTb4b4b4)Tb4b4b4:
Tff7b72with Te6edf3suppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Te6edf3destTff7b72.Td2a8ffderegister_request_handlerTb4b4b4(Te6edf3pathTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_registered_map_pathsTff7b72.Td2a8ffclearTb4b4b4(Tb4b4b4)
Tff7b72with Te6edf3suppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Te6edf3destTff7b72.Td2a8ffderegister_request_handlerTb4b4b4(Te6edf3CATALOG_PATHTb4b4b4)
Tff7b72with Te6edf3suppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffderegister_destinationTb4b4b4(Te6edf3destTb4b4b4)

Tff7b72def Td2a8ff_on_linkTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3_linkTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72return

Tff7b72def Td2a8ff_register_all_handlersTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Te6edf3dest Tff7b72= Tff7b72selfTff7b72.Td2a8ff_destination
Tff7b72if Te6edf3dest Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return
Te6edf3destTff7b72.Td2a8ffregister_request_handlerTb4b4b4(
Te6edf3CATALOG_PATHTb4b4b4,
Te6edf3response_generatorTff7b72=Tff7b72selfTff7b72.Td2a8ff_catalog_responderTb4b4b4,
Te6edf3allowTff7b72=Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffALLOW_ALLTb4b4b4,
Tb4b4b4)
Tff7b72for Te6edf3row Tff7b72in Tff7b72selfTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffmap_publishedTff7b72.Td2a8fflist_for_identityTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentity_hashTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_register_map_handlerTb4b4b4(Tffa657strTb4b4b4(Te6edf3rowTb4b4b4[Ta5d6ff"Ta5d6ffmap_idTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4)

Tff7b72def Td2a8ff_register_map_handlerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3map_idTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Te6edf3dest Tff7b72= Tff7b72selfTff7b72.Td2a8ff_destination
Tff7b72if Te6edf3dest Tff7b72is Tff7b72None Tff7b72or Tff7b72not Te6edf3MAP_ID_RETff7b72.Td2a8fffullmatchTb4b4b4(Te6edf3map_idTb4b4b4)Tb4b4b4:
Tff7b72return
Te6edf3path Tff7b72= Te6edf3MAP_PATH_PREFIX Tff7b72+ Te6edf3map_id
Tff7b72if Te6edf3path Tff7b72in Tff7b72selfTff7b72.Td2a8ff_registered_map_pathsTb4b4b4:
Tff7b72return
Te6edf3destTff7b72.Td2a8ffregister_request_handlerTb4b4b4(
Te6edf3pathTb4b4b4,
Te6edf3response_generatorTff7b72=Tff7b72selfTff7b72.Td2a8ff_make_map_responderTb4b4b4(Te6edf3map_idTb4b4b4)Tb4b4b4,
Te6edf3allowTff7b72=Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffALLOW_ALLTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_registered_map_pathsTff7b72.Td2a8ffaddTb4b4b4(Te6edf3pathTb4b4b4)

Tff7b72def Td2a8ff_deregister_map_handlerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3map_idTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Te6edf3dest Tff7b72= Tff7b72selfTff7b72.Td2a8ff_destination
Te6edf3path Tff7b72= Te6edf3MAP_PATH_PREFIX Tff7b72+ Te6edf3map_id
Tff7b72if Te6edf3dest Tff7b72is Tff7b72None Tff7b72or Te6edf3path Tff7b72not Tff7b72in Tff7b72selfTff7b72.Td2a8ff_registered_map_pathsTb4b4b4:
Tff7b72return
Tff7b72with Te6edf3suppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Te6edf3destTff7b72.Td2a8ffderegister_request_handlerTb4b4b4(Te6edf3pathTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_registered_map_pathsTff7b72.Td2a8ffdiscardTb4b4b4(Te6edf3pathTb4b4b4)

Tff7b72def Td2a8ff_catalog_payloadTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Te6edf3maps Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3row Tff7b72in Tff7b72selfTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffmap_publishedTff7b72.Td2a8fflist_for_identityTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentity_hashTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3mapsTff7b72.Td2a8ffappendTb4b4b4(
Tb4b4b4{
Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4: Te6edf3rowTb4b4b4[Ta5d6ff"Ta5d6ffmap_idTa5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Te6edf3rowTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffformatTa5d6ff"Tb4b4b4: Te6edf3rowTb4b4b4[Ta5d6ff"Ta5d6ffformatTa5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffsizeTa5d6ff"Tb4b4b4: Tffa657intTb4b4b4(Te6edf3rowTb4b4b4[Ta5d6ff"Ta5d6ffsizeTa5d6ff"Tb4b4b4] Tff7b72or T79c0ff0Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffsha256Ta5d6ff"Tb4b4b4: Te6edf3rowTb4b4b4[Ta5d6ff"Ta5d6ffsha256Ta5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffbboxTa5d6ff"Tb4b4b4: Te6edf3_parse_bboxTb4b4b4(Te6edf3rowTb4b4b4[Ta5d6ff"Ta5d6ffbboxTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6fffeature_countTa5d6ff"Tb4b4b4: Tffa657intTb4b4b4(Te6edf3rowTb4b4b4[Ta5d6ff"Ta5d6fffeature_countTa5d6ff"Tb4b4b4] Tff7b72or T79c0ff0Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffupdated_atTa5d6ff"Tb4b4b4: Te6edf3rowTb4b4b4[Ta5d6ff"Ta5d6ffupdated_atTa5d6ff"Tb4b4b4]Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffmapsTa5d6ff"Tb4b4b4: Te6edf3mapsTb4b4b4}

Tff7b72def Td2a8ff_catalog_responderTb4b4b4(
Tff7b72selfTb4b4b4, Te6edf3pathTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3request_idTb4b4b4, Te6edf3link_idTb4b4b4, Te6edf3remote_identityTb4b4b4, Te6edf3requested_at
Tb4b4b4)Tb4b4b4:
Te6edf3body Tff7b72= Te6edf3jsonTff7b72.Td2a8ffdumpsTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_catalog_payloadTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3separatorsTff7b72=Tb4b4b4(Ta5d6ff"Ta5d6ff,Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff:Ta5d6ff"Tb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffencodeTb4b4b4(
Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"
Tb4b4b4)
Tff7b72return Te6edf3body

Tff7b72def Td2a8ff_make_map_responderTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3map_idTb4b4b4: Tffa657strTb4b4b4)Tb4b4b4:
Tff7b72def Td2a8ffresponderTb4b4b4(Te6edf3pathTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3request_idTb4b4b4, Te6edf3link_idTb4b4b4, Te6edf3remote_identityTb4b4b4, Te6edf3requested_atTb4b4b4)Tb4b4b4:
Te6edf3row Tff7b72= Tff7b72selfTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffmap_publishedTff7b72.Td2a8ffget_by_map_idTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffidentity_hashTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3map_id
Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3rowTb4b4b4:
Tff7b72return Tff7b72None
Te6edf3abs_path Tff7b72= Tff7b72selfTff7b72.Td2a8ff_resolve_published_fileTb4b4b4(Te6edf3map_idTb4b4b4, Te6edf3rowTb4b4b4[Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3abs_pathTb4b4b4:
Tff7b72return Tff7b72None
Te6edf3max_bytes Tff7b72= Tff7b72selfTff7b72.Td2a8ff_cfg_max_bytesTb4b4b4(Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3body Tff7b72= Te6edf3read_regular_file_bytesTb4b4b4(Te6edf3abs_pathTb4b4b4, Te6edf3max_bytesTff7b72=Te6edf3max_bytesTb4b4b4)
Tff7b72except Tf85149OSErrorTb4b4b4:
Tff7b72return Tff7b72None
Te6edf3expected Tff7b72= Tffa657strTb4b4b4(Te6edf3rowTb4b4b4[Ta5d6ff"Ta5d6ffsha256Ta5d6ff"Tb4b4b4] Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3expected Tff7b72and Te6edf3hashlibTff7b72.Td2a8ffsha256Tb4b4b4(Te6edf3bodyTb4b4b4)Tff7b72.Td2a8ffhexdigestTb4b4b4(Tb4b4b4) Tff7b72!= Te6edf3expectedTb4b4b4:
Tff7b72return Tff7b72None
Te6edf3name Tff7b72= Tb4b4b4(Te6edf3rowTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72or Te6edf3map_idTb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff.Ta5d6ff" Tff7b72+ Tb4b4b4(Te6edf3rowTb4b4b4[Ta5d6ff"Ta5d6ffformatTa5d6ff"Tb4b4b4] Tff7b72or Ta5d6ff"Ta5d6ffbinTa5d6ff"Tb4b4b4)
Tff7b72return Tb4b4b4[Te6edf3bodyTb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Te6edf3nameTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4}Tb4b4b4]

Tff7b72return Te6edf3responder

Tff7b72def Td2a8fflist_publishedTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657listTb4b4b4[Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4]Tb4b4b4:
Te6edf3rows Tff7b72= Tff7b72selfTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffmap_publishedTff7b72.Td2a8fflist_for_identityTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentity_hashTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3out Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3row Tff7b72in Te6edf3rowsTb4b4b4:
Te6edf3item Tff7b72= Tb4b4b4(
Tffa657dictTb4b4b4(Te6edf3rowTb4b4b4)
Tff7b72if Tff7b72not Tffa657hasattrTb4b4b4(Te6edf3rowTb4b4b4, Ta5d6ff"Ta5d6ffkeysTa5d6ff"Tb4b4b4)
Tff7b72else Tb4b4b4{Te6edf3kTb4b4b4: Te6edf3rowTb4b4b4[Te6edf3kTb4b4b4] Tff7b72for Te6edf3k Tff7b72in Te6edf3rowTff7b72.Td2a8ffkeysTb4b4b4(Tb4b4b4)Tb4b4b4}
Tb4b4b4)
Te6edf3itemTb4b4b4[Ta5d6ff"Ta5d6ffbboxTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3_parse_bboxTb4b4b4(Te6edf3itemTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffbboxTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3outTff7b72.Td2a8ffappendTb4b4b4(Te6edf3itemTb4b4b4)
Tff7b72return Te6edf3out

Tff7b72def Td2a8ffpublish_bytesTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3payloadTb4b4b4: Tffa657bytesTb4b4b4,
Tff7b72*Tb4b4b4,
Te6edf3nameTb4b4b4: Tffa657strTb4b4b4,
Te6edf3hinted_formatTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Te6edf3max_bytes Tff7b72= Tff7b72selfTff7b72.Td2a8ff_cfg_max_bytesTb4b4b4(Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3payloadTb4b4b4) Tff7b72> Te6edf3max_bytesTb4b4b4:
Tff7b72raise Te6edf3MapDataErrorTb4b4b4(Ta5d6ff"Ta5d6fffile_too_largeTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_published_countTb4b4b4(Tb4b4b4) Tff7b72>Tff7b72= Te6edf3MAX_PUBLISHED_MAPSTb4b4b4:
Tff7b72raise Te6edf3MapDataErrorTb4b4b4(Ta5d6ff"Ta5d6ffmax_published_exceededTa5d6ff"Tb4b4b4)
Te6edf3sanitized Tff7b72= Te6edf3sanitize_geo_bytesTb4b4b4(Te6edf3payloadTb4b4b4, Te6edf3hinted_formatTff7b72=Te6edf3hinted_formatTb4b4b4)
Te6edf3limits Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffmax_bytesTa5d6ff"Tb4b4b4: Te6edf3max_bytesTb4b4b4,
Ta5d6ff"Ta5d6ffmax_featuresTa5d6ff"Tb4b4b4: Tffa657intTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigTff7b72.Td2a8ffmap_overlay_max_featuresTff7b72.Td2a8ffgetTb4b4b4(Tb4b4b4) Tff7b72or T79c0ff50_000Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffmax_kmzTa5d6ff"Tb4b4b4: Tffa657intTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffconfigTff7b72.Td2a8ffmap_overlay_max_kmz_uncompressed_bytesTff7b72.Td2a8ffgetTb4b4b4(Tb4b4b4)
Tff7b72or Tb4b4b4(T79c0ff16 Tff7b72* T79c0ff1024 Tff7b72* T79c0ff1024Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4}
Te6edf3validated Tff7b72= Te6edf3validate_geo_bytesTb4b4b4(
Te6edf3sanitizedTff7b72.Td2a8ffdataTb4b4b4,
Te6edf3hinted_formatTff7b72=Te6edf3sanitizedTff7b72.Td2a8ffformatTb4b4b4,
Te6edf3max_bytesTff7b72=Te6edf3limitsTb4b4b4[Ta5d6ff"Ta5d6ffmax_bytesTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3max_featuresTff7b72=Te6edf3limitsTb4b4b4[Ta5d6ff"Ta5d6ffmax_featuresTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3max_kmz_uncompressed_bytesTff7b72=Te6edf3limitsTb4b4b4[Ta5d6ff"Ta5d6ffmax_kmzTa5d6ff"Tb4b4b4]Tb4b4b4,
Tb4b4b4)
Te6edf3map_id Tff7b72= Te6edf3uuidTff7b72.Td2a8ffuuid4Tb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffhexTb4b4b4[Tb4b4b4:T79c0ff16Tb4b4b4]
Te6edf3ext Tff7b72= Te6edf3validatedTff7b72.Td2a8ffformat
Te6edf3rel Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3map_idTffd700}Ta5d6ff.Tffd700{Te6edf3extTffd700}Ta5d6ff"
Te6edf3abs_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdata_rootTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3relTb4b4b4)
Te6edf3atomic_write_bytesTb4b4b4(Te6edf3abs_pathTb4b4b4, Te6edf3sanitizedTff7b72.Td2a8ffdataTb4b4b4)
Te6edf3digest Tff7b72= Te6edf3hashlibTff7b72.Td2a8ffsha256Tb4b4b4(Te6edf3sanitizedTff7b72.Td2a8ffdataTb4b4b4)Tff7b72.Td2a8ffhexdigestTb4b4b4(Tb4b4b4)
Te6edf3display Tff7b72= Tffa657strTb4b4b4(Te6edf3name Tff7b72or Ta5d6ff"Ta5d6ffmapTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4[Tb4b4b4:T79c0ff200Tb4b4b4] Tff7b72or Ta5d6ff"Ta5d6ffmapTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffmap_publishedTff7b72.Td2a8ffinsertTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffidentity_hashTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3map_idTff7b72=Te6edf3map_idTb4b4b4,
Te6edf3nameTff7b72=Te6edf3displayTb4b4b4,
Tffa657formatTff7b72=Te6edf3validatedTff7b72.Td2a8ffformatTb4b4b4,
Te6edf3sizeTff7b72=Tffa657lenTb4b4b4(Te6edf3sanitizedTff7b72.Td2a8ffdataTb4b4b4)Tb4b4b4,
Te6edf3sha256Tff7b72=Te6edf3digestTb4b4b4,
Te6edf3bboxTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3feature_countTff7b72=Te6edf3validatedTff7b72.Td2a8fffeature_countTb4b4b4,
Te6edf3pathTff7b72=Te6edf3relTb4b4b4,
Tb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_runningTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_ensure_destination_lockedTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_register_map_handlerTb4b4b4(Te6edf3map_idTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_should_announceTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_announce_lockedTb4b4b4(Tb4b4b4)
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6ffmapTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_row_or_raiseTb4b4b4(Te6edf3map_idTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffstrippedTa5d6ff"Tb4b4b4: Te6edf3sanitizedTff7b72.Td2a8ffstrippedTb4b4b4,
Tb4b4b4}

Tff7b72def Td2a8ffunpublishTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3map_idTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Tff7b72if Tff7b72not Te6edf3MAP_ID_RETff7b72.Td2a8fffullmatchTb4b4b4(Te6edf3map_id Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72raise Te6edf3MapDataErrorTb4b4b4(Ta5d6ff"Ta5d6ffinvalid_map_idTa5d6ff"Tb4b4b4)
Te6edf3row Tff7b72= Tff7b72selfTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffmap_publishedTff7b72.Td2a8ffget_by_map_idTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentity_hashTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3map_idTb4b4b4)
Tff7b72if Tff7b72not Te6edf3rowTb4b4b4:
Tff7b72return Tff7b72False
Te6edf3rel Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffbasenameTb4b4b4(Te6edf3rowTb4b4b4[Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4] Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3abs_path Tff7b72= Tff7b72selfTff7b72.Td2a8ff_resolve_published_fileTb4b4b4(Te6edf3map_idTb4b4b4, Te6edf3relTb4b4b4)
Tff7b72if Te6edf3abs_pathTb4b4b4:
Tff7b72with Te6edf3suppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffremoveTb4b4b4(Te6edf3abs_pathTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffmap_publishedTff7b72.Td2a8ffdeleteTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentity_hashTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3map_idTb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_deregister_map_handlerTb4b4b4(Te6edf3map_idTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_published_countTb4b4b4(Tb4b4b4) Tff7b72<Tff7b72= T79c0ff0Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_teardown_destination_lockedTb4b4b4(Tb4b4b4)
Tff7b72elif Tff7b72selfTff7b72.Td2a8ff_should_announceTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_announce_lockedTb4b4b4(Tb4b4b4)
Tff7b72return Tff7b72True

Tff7b72def Td2a8ff_row_or_raiseTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3map_idTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Te6edf3row Tff7b72= Tff7b72selfTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffmap_publishedTff7b72.Td2a8ffget_by_map_idTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentity_hashTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3map_idTb4b4b4)
Tff7b72if Tff7b72not Te6edf3rowTb4b4b4:
Tff7b72raise Te6edf3MapDataErrorTb4b4b4(Ta5d6ff"Ta5d6ffnot_foundTa5d6ff"Tb4b4b4)
Te6edf3item Tff7b72= Tb4b4b4{Te6edf3kTb4b4b4: Te6edf3rowTb4b4b4[Te6edf3kTb4b4b4] Tff7b72for Te6edf3k Tff7b72in Te6edf3rowTff7b72.Td2a8ffkeysTb4b4b4(Tb4b4b4)Tb4b4b4}
Te6edf3itemTb4b4b4[Ta5d6ff"Ta5d6ffbboxTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3_parse_bboxTb4b4b4(Te6edf3itemTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffbboxTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3item

Tff7b72def Td2a8ffannounceTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_runningTb4b4b4:
Tff7b72raise Te6edf3MapDataErrorTb4b4b4(Ta5d6ff"Ta5d6ffnot_runningTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_published_countTb4b4b4(Tb4b4b4) Tff7b72<Tff7b72= T79c0ff0Tb4b4b4:
Tff7b72raise Te6edf3MapDataErrorTb4b4b4(Ta5d6ff"Ta5d6ffnothing_publishedTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_ensure_destination_lockedTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_announce_lockedTb4b4b4(Tb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ffstatusTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ff_announce_lockedTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Te6edf3dest Tff7b72= Tff7b72selfTff7b72.Td2a8ff_destination
Tff7b72if Te6edf3dest Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72raise Te6edf3MapDataErrorTb4b4b4(Ta5d6ff"Ta5d6ffnot_runningTa5d6ff"Tb4b4b4)
Te6edf3count Tff7b72= Tff7b72selfTff7b72.Td2a8ff_published_countTb4b4b4(Tb4b4b4)
Te6edf3app_data Tff7b72= Te6edf3jsonTff7b72.Td2a8ffdumpsTb4b4b4(
Tb4b4b4{Ta5d6ff"Ta5d6ffvTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4, Ta5d6ff"Ta5d6ffnTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_display_nameTb4b4b4(Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffcTa5d6ff"Tb4b4b4: Te6edf3countTb4b4b4}Tb4b4b4,
Te6edf3separatorsTff7b72=Tb4b4b4(Ta5d6ff"Ta5d6ff,Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff:Ta5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Te6edf3destTff7b72.Td2a8ffannounceTb4b4b4(Te6edf3app_dataTff7b72=Te6edf3app_dataTb4b4b4)

Tff7b72def Td2a8ffupdate_settingsTb4b4b4(
Tff7b72selfTb4b4b4,
Tff7b72*Tb4b4b4,
Te6edf3display_nameTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3announce_enabledTb4b4b4: Tffa657bool Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3announce_intervalTb4b4b4: Tffa657int Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Tff7b72if Te6edf3display_name Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTff7b72.Td2a8ffmap_data_display_nameTff7b72.Td2a8ffsetTb4b4b4(
Tffa657strTb4b4b4(Te6edf3display_nameTb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4[Tb4b4b4:Te6edf3DISPLAY_NAME_MAXTb4b4b4]
Tb4b4b4)
Tff7b72if Te6edf3announce_enabled Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTff7b72.Td2a8ffmap_data_announce_enabledTff7b72.Td2a8ffsetTb4b4b4(Tffa657boolTb4b4b4(Te6edf3announce_enabledTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3announce_interval Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTff7b72.Td2a8ffmap_data_announce_intervalTff7b72.Td2a8ffsetTb4b4b4(
Te6edf3clamp_announce_intervalTb4b4b4(Te6edf3announce_intervalTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_sync_announce_timerTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_should_announceTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_ensure_destination_lockedTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_announce_lockedTb4b4b4(Tb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ffstatusTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ff_cancel_announce_timerTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Te6edf3timer Tff7b72= Tff7b72selfTff7b72.Td2a8ff_announce_timer
Tff7b72selfTff7b72.Td2a8ff_announce_timer Tff7b72= Tff7b72None
Tff7b72if Te6edf3timer Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72with Te6edf3suppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Te6edf3timerTff7b72.Td2a8ffcancelTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ff_sync_announce_timerTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_cancel_announce_timerTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_running Tff7b72or Tff7b72not Tff7b72selfTff7b72.Td2a8ff_should_announceTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return
Te6edf3interval Tff7b72= Tff7b72selfTff7b72.Td2a8ff_announce_intervalTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3interval Tff7b72<Tff7b72= T79c0ff0Tb4b4b4:
Tff7b72return
Te6edf3timer Tff7b72= Te6edf3threadingTff7b72.Td2a8ffTimerTb4b4b4(Te6edf3intervalTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_announce_timer_fireTb4b4b4)
Te6edf3timerTff7b72.Td2a8ffdaemon Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ff_announce_timer Tff7b72= Te6edf3timer
Te6edf3timerTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ff_announce_timer_fireTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_running Tff7b72and Tff7b72selfTff7b72.Td2a8ff_should_announceTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_announce_lockedTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Te6edf3_logTff7b72.Td2a8ffexceptionTb4b4b4(Ta5d6ff"Ta5d6ffmap-data-v1 periodic announce failedTa5d6ff"Tb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_sync_announce_timerTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8fflist_heardTb4b4b4(
Tff7b72selfTb4b4b4, Tff7b72*Tb4b4b4, Te6edf3queryTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3limitTb4b4b4: Tffa657int Tff7b72= T79c0ff250
Tb4b4b4) Tff7b72-Tff7b72> Tffa657listTb4b4b4[Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4]Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787announce_manager Tff7b72import Te6edf3AnnounceManager

Te6edf3mgr Tff7b72= Te6edf3AnnounceManagerTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdatabaseTb4b4b4, Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4)
Te6edf3rows Tff7b72= Te6edf3mgrTff7b72.Td2a8ffget_filtered_announcesTb4b4b4(Te6edf3aspectTff7b72=Te6edf3MAP_ASPECTTb4b4b4, Te6edf3queryTff7b72=Te6edf3queryTb4b4b4, Te6edf3limitTff7b72=Te6edf3limitTb4b4b4)
Te6edf3out Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3q Tff7b72= Tb4b4b4(Te6edf3query Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3row Tff7b72in Te6edf3rowsTb4b4b4:
Te6edf3item Tff7b72= Tb4b4b4(
Tffa657dictTb4b4b4(Te6edf3rowTb4b4b4)
Tff7b72if Tff7b72not Tffa657hasattrTb4b4b4(Te6edf3rowTb4b4b4, Ta5d6ff"Ta5d6ffkeysTa5d6ff"Tb4b4b4)
Tff7b72else Tb4b4b4{Te6edf3kTb4b4b4: Te6edf3rowTb4b4b4[Te6edf3kTb4b4b4] Tff7b72for Te6edf3k Tff7b72in Te6edf3rowTff7b72.Td2a8ffkeysTb4b4b4(Tb4b4b4)Tb4b4b4}
Tb4b4b4)
Te6edf3parsed Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffvTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4, Ta5d6ff"Ta5d6ffnTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4}
Te6edf3app_data Tff7b72= Te6edf3itemTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffapp_dataTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3app_dataTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72import T7ee787base64

Te6edf3raw Tff7b72= Te6edf3base64Tff7b72.Td2a8ffb64decodeTb4b4b4(Te6edf3app_dataTb4b4b4)
Te6edf3parsed Tff7b72= Te6edf3parse_map_data_app_dataTb4b4b4(Te6edf3rawTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Te6edf3parsed Tff7b72= Te6edf3parse_map_data_app_dataTb4b4b4(Te6edf3app_dataTb4b4b4)
Te6edf3itemTb4b4b4[Ta5d6ff"Ta5d6ffmap_nameTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3parsedTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffnTa5d6ff"Tb4b4b4) Tff7b72or Ta5d6ff"Ta5d6ff"
Te6edf3itemTb4b4b4[Ta5d6ff"Ta5d6ffmap_countTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3parsedTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffcTa5d6ff"Tb4b4b4) Tff7b72or T79c0ff0
Tff7b72if Te6edf3qTb4b4b4:
Te6edf3blob Tff7b72= Tb4b4b4(
Ta5d6fffTa5d6ff"Tffd700{Te6edf3itemTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff'Ta5d6ffdestination_hashTa5d6ff'Tb4b4b4) Tff7b72or Ta5d6ff'Ta5d6ff'Tffd700}Ta5d6ff Tffd700{Te6edf3itemTb4b4b4[Ta5d6ff'Ta5d6ffmap_nameTa5d6ff'Tb4b4b4]Tffd700}Ta5d6ff"Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tb4b4b4)
Tff7b72if Te6edf3q Tff7b72not Tff7b72in Te6edf3blobTb4b4b4:
Tff7b72continue
Te6edf3outTff7b72.Td2a8ffappendTb4b4b4(Te6edf3itemTb4b4b4)
Tff7b72return Te6edf3out

Tff7b72def Td2a8ff_parse_catalog_bodyTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3bodyTb4b4b4: Tffa657bytesTb4b4b4, Te6edf3dest_hexTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3bodyTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4)Tb4b4b4) Tff7b72or Tffa657lenTb4b4b4(Te6edf3bodyTb4b4b4) Tff7b72> Te6edf3MAX_CATALOG_BYTESTb4b4b4:
Tff7b72raise Te6edf3MapDataErrorTb4b4b4(Ta5d6ff"Ta5d6ffinvalid_catalogTa5d6ff"Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3obj Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Tffa657bytesTb4b4b4(Te6edf3bodyTb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72except Tb4b4b4(Tf85149UnicodeDecodeErrorTb4b4b4, Te6edf3jsonTff7b72.Td2a8ffJSONDecodeErrorTb4b4b4) Tff7b72as Te6edf3excTb4b4b4:
Tff7b72raise Te6edf3MapDataErrorTb4b4b4(Ta5d6ff"Ta5d6ffinvalid_catalogTa5d6ff"Tb4b4b4) Tff7b72from T7ee787exc
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3objTb4b4b4, Tffa657dictTb4b4b4) Tff7b72or Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3objTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffmapsTa5d6ff"Tb4b4b4)Tb4b4b4, Tffa657listTb4b4b4)Tb4b4b4:
Tff7b72raise Te6edf3MapDataErrorTb4b4b4(Ta5d6ff"Ta5d6ffinvalid_catalogTa5d6ff"Tb4b4b4)
Te6edf3maps Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3entry Tff7b72in Te6edf3objTb4b4b4[Ta5d6ff"Ta5d6ffmapsTa5d6ff"Tb4b4b4]Tb4b4b4[Tb4b4b4:Te6edf3MAX_PUBLISHED_MAPSTb4b4b4]Tb4b4b4:
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3entryTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Tff7b72continue
Te6edf3map_id Tff7b72= Tffa657strTb4b4b4(Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4) Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3MAP_ID_RETff7b72.Td2a8fffullmatchTb4b4b4(Te6edf3map_idTb4b4b4)Tb4b4b4:
Tff7b72continue
Te6edf3fmt Tff7b72= Tffa657strTb4b4b4(Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffformatTa5d6ff"Tb4b4b4) Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tb4b4b4[Tb4b4b4:T79c0ff16Tb4b4b4]
Tff7b72if Te6edf3fmt Tff7b72== Ta5d6ff"Ta5d6ffjsonTa5d6ff"Tb4b4b4:
Te6edf3fmt Tff7b72= Ta5d6ff"Ta5d6ffgeojsonTa5d6ff"
Tff7b72if Te6edf3fmt Tff7b72and Te6edf3fmt Tff7b72not Tff7b72in Te6edf3ALLOWED_OVERLAY_FORMATSTb4b4b4:
Tff7b72continue
Te6edf3sha Tff7b72= Tffa657strTb4b4b4(Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffsha256Ta5d6ff"Tb4b4b4) Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3sha Tff7b72and Tff7b72not Te6edf3_SHA256_RETff7b72.Td2a8fffullmatchTb4b4b4(Te6edf3shaTb4b4b4)Tb4b4b4:
Te6edf3sha Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72tryTb4b4b4:
Te6edf3size Tff7b72= Tffa657intTb4b4b4(Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffsizeTa5d6ff"Tb4b4b4) Tff7b72or T79c0ff0Tb4b4b4)
Tff7b72except Tb4b4b4(Tf85149TypeErrorTb4b4b4, Tf85149ValueErrorTb4b4b4)Tb4b4b4:
Te6edf3size Tff7b72= T79c0ff0
Tff7b72if Te6edf3size Tff7b72< T79c0ff0 Tff7b72or Te6edf3size Tff7b72> Tff7b72selfTff7b72.Td2a8ff_cfg_max_bytesTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3size Tff7b72= T79c0ff0
Tff7b72tryTb4b4b4:
Te6edf3feature_count Tff7b72= Tffa657intTb4b4b4(Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fffeature_countTa5d6ff"Tb4b4b4) Tff7b72or T79c0ff0Tb4b4b4)
Tff7b72except Tb4b4b4(Tf85149TypeErrorTb4b4b4, Tf85149ValueErrorTb4b4b4)Tb4b4b4:
Te6edf3feature_count Tff7b72= T79c0ff0
Te6edf3mapsTff7b72.Td2a8ffappendTb4b4b4(
Tb4b4b4{
Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4: Te6edf3map_idTb4b4b4,
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Tffa657strTb4b4b4(Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4) Tff7b72or Te6edf3map_idTb4b4b4)Tb4b4b4[Tb4b4b4:T79c0ff200Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffformatTa5d6ff"Tb4b4b4: Te6edf3fmtTb4b4b4,
Ta5d6ff"Ta5d6ffsizeTa5d6ff"Tb4b4b4: Te6edf3sizeTb4b4b4,
Ta5d6ff"Ta5d6ffsha256Ta5d6ff"Tb4b4b4: Te6edf3shaTb4b4b4,
Ta5d6ff"Ta5d6ffbboxTa5d6ff"Tb4b4b4: Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffbboxTa5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6fffeature_countTa5d6ff"Tb4b4b4: Tffa657maxTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3feature_countTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffupdated_atTa5d6ff"Tb4b4b4: Tffa657strTb4b4b4(Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffupdated_atTa5d6ff"Tb4b4b4) Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4[Tb4b4b4:T79c0ff64Tb4b4b4]Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4: Te6edf3dest_hexTb4b4b4, Ta5d6ff"Ta5d6ffmapsTa5d6ff"Tb4b4b4: Te6edf3mapsTb4b4b4}

Tff7b72def Td2a8ff_read_local_map_bytesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3map_idTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657bytesTb4b4b4:
Te6edf3row Tff7b72= Tff7b72selfTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffmap_publishedTff7b72.Td2a8ffget_by_map_idTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentity_hashTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3map_idTb4b4b4)
Tff7b72if Tff7b72not Te6edf3rowTb4b4b4:
Tff7b72raise Te6edf3MapDataErrorTb4b4b4(Ta5d6ff"Ta5d6ffnot_foundTa5d6ff"Tb4b4b4)
Te6edf3abs_path Tff7b72= Tff7b72selfTff7b72.Td2a8ff_resolve_published_fileTb4b4b4(Te6edf3map_idTb4b4b4, Te6edf3rowTb4b4b4[Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3abs_pathTb4b4b4:
Tff7b72raise Te6edf3MapDataErrorTb4b4b4(Ta5d6ff"Ta5d6ffnot_foundTa5d6ff"Tb4b4b4)
Te6edf3max_bytes Tff7b72= Tff7b72selfTff7b72.Td2a8ff_cfg_max_bytesTb4b4b4(Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3body Tff7b72= Te6edf3read_regular_file_bytesTb4b4b4(Te6edf3abs_pathTb4b4b4, Te6edf3max_bytesTff7b72=Te6edf3max_bytesTb4b4b4)
Tff7b72except Tf85149OSError Tff7b72as Te6edf3excTb4b4b4:
Tff7b72raise Te6edf3MapDataErrorTb4b4b4(Ta5d6ff"Ta5d6ffnot_foundTa5d6ff"Tb4b4b4) Tff7b72from T7ee787exc
Te6edf3expected Tff7b72= Tffa657strTb4b4b4(Te6edf3rowTb4b4b4[Ta5d6ff"Ta5d6ffsha256Ta5d6ff"Tb4b4b4] Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3expected Tff7b72and Te6edf3hashlibTff7b72.Td2a8ffsha256Tb4b4b4(Te6edf3bodyTb4b4b4)Tff7b72.Td2a8ffhexdigestTb4b4b4(Tb4b4b4) Tff7b72!= Te6edf3expectedTb4b4b4:
Tff7b72raise Te6edf3MapDataErrorTb4b4b4(Ta5d6ff"Ta5d6ffsha256_mismatchTa5d6ff"Tb4b4b4)
Tff7b72return Te6edf3body

Tff7b72async Tff7b72def Td2a8fffetch_catalogTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3destination_hashTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Te6edf3dest Tff7b72= Te6edf3_require_dest_hashTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_is_local_hashTb4b4b4(Te6edf3destTb4b4b4)Tb4b4b4:
Te6edf3body Tff7b72= Te6edf3jsonTff7b72.Td2a8ffdumpsTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_catalog_payloadTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3separatorsTff7b72=Tb4b4b4(Ta5d6ff"Ta5d6ff,Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff:Ta5d6ff"Tb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffencodeTb4b4b4(
Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"
Tb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_parse_catalog_bodyTb4b4b4(Te6edf3bodyTb4b4b4, Te6edf3destTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3body Tff7b72= Tff7b72await Tff7b72selfTff7b72.Td2a8ff_link_requestTb4b4b4(Te6edf3destTb4b4b4, Te6edf3CATALOG_PATHTb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_parse_catalog_bodyTb4b4b4(Te6edf3bodyTb4b4b4, Te6edf3destTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)Tb4b4b4)

Tff7b72async Tff7b72def Td2a8fffetch_map_bytesTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3destination_hashTb4b4b4: Tffa657strTb4b4b4,
Te6edf3map_idTb4b4b4: Tffa657strTb4b4b4,
Tff7b72*Tb4b4b4,
Te6edf3expected_sha256Tb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3hinted_formatTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tffa657bytesTb4b4b4:
Tff7b72if Tff7b72not Te6edf3MAP_ID_RETff7b72.Td2a8fffullmatchTb4b4b4(Te6edf3map_id Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72raise Te6edf3MapDataErrorTb4b4b4(Ta5d6ff"Ta5d6ffinvalid_map_idTa5d6ff"Tb4b4b4)
Te6edf3dest Tff7b72= Te6edf3_require_dest_hashTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_is_local_hashTb4b4b4(Te6edf3destTb4b4b4)Tb4b4b4:
Te6edf3body Tff7b72= Tff7b72selfTff7b72.Td2a8ff_read_local_map_bytesTb4b4b4(Te6edf3map_idTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3body Tff7b72= Tff7b72await Tff7b72selfTff7b72.Td2a8ff_link_requestTb4b4b4(Te6edf3destTb4b4b4, Te6edf3MAP_PATH_PREFIX Tff7b72+ Te6edf3map_idTb4b4b4)
Te6edf3max_bytes Tff7b72= Tff7b72selfTff7b72.Td2a8ff_cfg_max_bytesTb4b4b4(Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3bodyTb4b4b4) Tff7b72> Te6edf3max_bytesTb4b4b4:
Tff7b72raise Te6edf3MapDataErrorTb4b4b4(Ta5d6ff"Ta5d6fffile_too_largeTa5d6ff"Tb4b4b4)
Te6edf3want Tff7b72= Tffa657strTb4b4b4(Te6edf3expected_sha256 Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3wantTb4b4b4:
Tff7b72if Tff7b72not Te6edf3_SHA256_RETff7b72.Td2a8fffullmatchTb4b4b4(Te6edf3wantTb4b4b4)Tb4b4b4:
Tff7b72raise Te6edf3MapDataErrorTb4b4b4(Ta5d6ff"Ta5d6ffsha256_mismatchTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3hashlibTff7b72.Td2a8ffsha256Tb4b4b4(Te6edf3bodyTb4b4b4)Tff7b72.Td2a8ffhexdigestTb4b4b4(Tb4b4b4) Tff7b72!= Te6edf3wantTb4b4b4:
Tff7b72raise Te6edf3MapDataErrorTb4b4b4(Ta5d6ff"Ta5d6ffsha256_mismatchTa5d6ff"Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3sanitized Tff7b72= Te6edf3sanitize_geo_bytesTb4b4b4(Te6edf3bodyTb4b4b4, Te6edf3hinted_formatTff7b72=Te6edf3hinted_formatTb4b4b4)
Te6edf3validate_geo_bytesTb4b4b4(
Te6edf3sanitizedTff7b72.Td2a8ffdataTb4b4b4,
Te6edf3hinted_formatTff7b72=Te6edf3sanitizedTff7b72.Td2a8ffformatTb4b4b4,
Te6edf3max_bytesTff7b72=Te6edf3max_bytesTb4b4b4,
Te6edf3max_featuresTff7b72=Tffa657intTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigTff7b72.Td2a8ffmap_overlay_max_featuresTff7b72.Td2a8ffgetTb4b4b4(Tb4b4b4) Tff7b72or T79c0ff50_000Tb4b4b4)Tb4b4b4,
Te6edf3max_kmz_uncompressed_bytesTff7b72=Tffa657intTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffconfigTff7b72.Td2a8ffmap_overlay_max_kmz_uncompressed_bytesTff7b72.Td2a8ffgetTb4b4b4(Tb4b4b4)
Tff7b72or Tb4b4b4(T79c0ff16 Tff7b72* T79c0ff1024 Tff7b72* T79c0ff1024Tb4b4b4)
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72except Te6edf3GeoValidationError Tff7b72as Te6edf3excTb4b4b4:
Tff7b72raise Te6edf3MapDataErrorTb4b4b4(Te6edf3excTff7b72.Td2a8ffcodeTb4b4b4) Tff7b72from T7ee787exc
Tff7b72return Te6edf3sanitizedTff7b72.Td2a8ffdata

Tff7b72async Tff7b72def Td2a8ffadd_as_overlayTb4b4b4(
Tff7b72selfTb4b4b4, Te6edf3destination_hashTb4b4b4: Tffa657strTb4b4b4, Te6edf3map_idTb4b4b4: Tffa657str
Tb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Te6edf3getter Tff7b72= Tff7b72selfTff7b72.Td2a8ff_overlay_manager_getter
Te6edf3overlay_manager Tff7b72= Te6edf3getterTb4b4b4(Tb4b4b4) Tff7b72if Te6edf3getter Tff7b72else Tff7b72None
Tff7b72if Te6edf3overlay_manager Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72raise Te6edf3MapDataErrorTb4b4b4(Ta5d6ff"Ta5d6ffoverlay_unavailableTa5d6ff"Tb4b4b4)
Te6edf3dest Tff7b72= Te6edf3_require_dest_hashTb4b4b4(Te6edf3destination_hashTb4b4b4)
Te6edf3catalog Tff7b72= Tff7b72await Tff7b72selfTff7b72.Td2a8fffetch_catalogTb4b4b4(Te6edf3destination_hashTb4b4b4)
Te6edf3name Tff7b72= Te6edf3map_id
Te6edf3hinted Tff7b72= Tff7b72None
Te6edf3expected_sha Tff7b72= Tff7b72None
Tff7b72for Te6edf3entry Tff7b72in Te6edf3catalogTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffmapsTa5d6ff"Tb4b4b4) Tff7b72or Tb4b4b4[Tb4b4b4]Tb4b4b4:
Tff7b72if Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4) Tff7b72== Te6edf3map_idTb4b4b4:
Te6edf3name Tff7b72= Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4) Tff7b72or Te6edf3map_id
Te6edf3hinted Tff7b72= Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffformatTa5d6ff"Tb4b4b4) Tff7b72or Tff7b72None
Te6edf3expected_sha Tff7b72= Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffsha256Ta5d6ff"Tb4b4b4) Tff7b72or Tff7b72None
Tff7b72break
Tff7b72elseTb4b4b4:
Tff7b72raise Te6edf3MapDataErrorTb4b4b4(Ta5d6ff"Ta5d6ffnot_foundTa5d6ff"Tb4b4b4)
Te6edf3payload Tff7b72= Tff7b72await Tff7b72selfTff7b72.Td2a8fffetch_map_bytesTb4b4b4(
Te6edf3destination_hashTb4b4b4,
Te6edf3map_idTb4b4b4,
Te6edf3expected_sha256Tff7b72=Te6edf3expected_shaTb4b4b4,
Te6edf3hinted_formatTff7b72=Te6edf3hintedTb4b4b4,
Tb4b4b4)
Tff7b72return Tff7b72await Te6edf3overlay_managerTff7b72.Td2a8ffingest_local_overlayTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffidentity_hashTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3kindTff7b72=Te6edf3KIND_MAP_DATATb4b4b4,
Te6edf3destination_hashTff7b72=Te6edf3destTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3path_or_repo_pathTff7b72=Te6edf3map_idTb4b4b4,
Te6edf3nameTff7b72=Te6edf3nameTb4b4b4,
Te6edf3payloadTff7b72=Te6edf3payloadTb4b4b4,
Te6edf3hinted_formatTff7b72=Te6edf3hintedTb4b4b4,
Tb4b4b4)

Tff7b72async Tff7b72def Td2a8ff_link_requestTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3destination_hashTb4b4b4: Tffa657bytesTb4b4b4, Te6edf3pathTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657bytesTb4b4b4:
Te6edf3getter Tff7b72= Tff7b72selfTff7b72.Td2a8ff_link_manager_getter
Te6edf3link_manager Tff7b72= Te6edf3getterTb4b4b4(Tb4b4b4) Tff7b72if Te6edf3getter Tff7b72else Tff7b72None
Tff7b72if Te6edf3link_manager Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72raise Te6edf3MapDataErrorTb4b4b4(Ta5d6ff"Ta5d6fflink_unavailableTa5d6ff"Tb4b4b4)
Te6edf3path_timeout Tff7b72= Tff7b72selfTff7b72.Td2a8ff_cfg_timeoutTb4b4b4(Ta5d6ff"Ta5d6ffmap_overlay_path_timeout_secondsTa5d6ff"Tb4b4b4, T79c0ff30Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3path_timeout Tff7b72= Tffa657maxTb4b4b4(
Tffa657floatTb4b4b4(Te6edf3path_timeoutTb4b4b4)Tb4b4b4,
Te6edf3path_response_windowTb4b4b4(Te6edf3destination_hashTb4b4b4, Tff7b72selfTff7b72.Td2a8ffreticulumTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Te6edf3path_timeout Tff7b72= Tffa657floatTb4b4b4(Te6edf3path_timeoutTb4b4b4)
Te6edf3transfer_timeout Tff7b72= Tff7b72selfTff7b72.Td2a8ff_cfg_timeoutTb4b4b4(
Ta5d6ff"Ta5d6ffmap_overlay_transfer_timeout_secondsTa5d6ff"Tb4b4b4,
T79c0ff120Tb4b4b4,
Tb4b4b4)
Te6edf3job_timeout Tff7b72= Tff7b72selfTff7b72.Td2a8ff_cfg_timeoutTb4b4b4(Ta5d6ff"Ta5d6ffmap_overlay_job_timeout_secondsTa5d6ff"Tb4b4b4, T79c0ff300Tb4b4b4)
Te6edf3linkTb4b4b4, Te6edf3_identifiedTb4b4b4, Te6edf3failure Tff7b72= Tff7b72await Te6edf3link_managerTff7b72.Td2a8ffopen_linkTb4b4b4(
Te6edf3destination_hashTb4b4b4,
Te6edf3MAP_ASPECTTb4b4b4,
Te6edf3path_lookup_timeoutTff7b72=Tffa657floatTb4b4b4(Te6edf3path_timeoutTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72if Te6edf3link Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3code Tff7b72= Tb4b4b4(
Ta5d6ff"Ta5d6ffmissing_pathTa5d6ff" Tff7b72if Te6edf3failure Tff7b72and Ta5d6ff"Ta5d6ffpathTa5d6ff" Tff7b72in Tffa657strTb4b4b4(Te6edf3failureTb4b4b4) Tff7b72else Ta5d6ff"Ta5d6fflink_failedTa5d6ff"
Tb4b4b4)
Tff7b72raise Te6edf3MapDataErrorTb4b4b4(Te6edf3codeTb4b4b4, Te6edf3failureTb4b4b4)

Te6edf3loop Tff7b72= Te6edf3asyncioTff7b72.Td2a8ffget_running_loopTb4b4b4(Tb4b4b4)
Te6edf3futureTb4b4b4: Te6edf3asyncioTff7b72.Td2a8ffFuture Tff7b72= Te6edf3loopTff7b72.Td2a8ffcreate_futureTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffon_responseTb4b4b4(Te6edf3receiptTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3body Tff7b72= Te6edf3coerce_map_request_bodyTb4b4b4(Tffa657getattrTb4b4b4(Te6edf3receiptTb4b4b4, Ta5d6ff"Ta5d6ffresponseTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)Tb4b4b4)
Tff7b72except Te6edf3MapDataError Tff7b72as Te6edf3excTb4b4b4:
Te6edf3loopTff7b72.Td2a8ffcall_soon_threadsafeTb4b4b4(Te6edf3_fail_futureTb4b4b4, Te6edf3futureTb4b4b4, Te6edf3excTb4b4b4)
Tff7b72return
Tff7b72except Tf85149ExceptionTb4b4b4:
Te6edf3loopTff7b72.Td2a8ffcall_soon_threadsafeTb4b4b4(
Te6edf3_fail_futureTb4b4b4,
Te6edf3futureTb4b4b4,
Te6edf3MapDataErrorTb4b4b4(Ta5d6ff"Ta5d6ffinvalid_responseTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72return
Te6edf3loopTff7b72.Td2a8ffcall_soon_threadsafeTb4b4b4(Te6edf3_resolve_futureTb4b4b4, Te6edf3futureTb4b4b4, Te6edf3bodyTb4b4b4)

Tff7b72def Td2a8ffon_failedTb4b4b4(Te6edf3_receiptTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3loopTff7b72.Td2a8ffcall_soon_threadsafeTb4b4b4(
Te6edf3_fail_futureTb4b4b4,
Te6edf3futureTb4b4b4,
Te6edf3MapDataErrorTb4b4b4(Ta5d6ff"Ta5d6ffrequest_failedTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)

Tff7b72tryTb4b4b4:
Te6edf3link_managerTff7b72.Td2a8ffrequestTb4b4b4(
Te6edf3destination_hashTb4b4b4,
Te6edf3MAP_ASPECTTb4b4b4,
Te6edf3pathTb4b4b4,
Tff7b72NoneTb4b4b4,
Te6edf3on_responseTb4b4b4,
Te6edf3on_failedTb4b4b4,
Tff7b72lambda Te6edf3_rTb4b4b4: Tff7b72NoneTb4b4b4,
Te6edf3timeoutTff7b72=Tffa657floatTb4b4b4(Te6edf3transfer_timeoutTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72except Tf85149RuntimeError Tff7b72as Te6edf3excTb4b4b4:
Tff7b72raise Te6edf3MapDataErrorTb4b4b4(Ta5d6ff"Ta5d6ffno_active_linkTa5d6ff"Tb4b4b4) Tff7b72from T7ee787exc
Tff7b72tryTb4b4b4:
Tff7b72return Tff7b72await Te6edf3asyncioTff7b72.Td2a8ffwait_forTb4b4b4(Te6edf3futureTb4b4b4, Te6edf3timeoutTff7b72=Tffa657floatTb4b4b4(Te6edf3job_timeoutTb4b4b4)Tb4b4b4)
Tff7b72except Tf85149TimeoutError Tff7b72as Te6edf3excTb4b4b4:
Tff7b72raise Te6edf3MapDataErrorTb4b4b4(Ta5d6ff"Ta5d6ffjob_timeoutTa5d6ff"Tb4b4b4) Tff7b72from T7ee787exc


Tff7b72def Td2a8ff_resolve_futureTb4b4b4(Te6edf3futureTb4b4b4: Te6edf3asyncioTff7b72.Td2a8ffFutureTb4b4b4, Te6edf3valueTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Te6edf3futureTff7b72.Td2a8ffdoneTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3futureTff7b72.Td2a8ffset_resultTb4b4b4(Te6edf3valueTb4b4b4)


Tff7b72def Td2a8ff_fail_futureTb4b4b4(Te6edf3futureTb4b4b4: Te6edf3asyncioTff7b72.Td2a8ffFutureTb4b4b4, Te6edf3excTb4b4b4: Tf85149BaseExceptionTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Te6edf3futureTff7b72.Td2a8ffdoneTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3futureTff7b72.Td2a8ffset_exceptionTb4b4b4(Te6edf3excTb4b4b4)


Tff7b72def Td2a8ff_require_dest_hashTb4b4b4(Te6edf3valueTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657bytesTb4b4b4:
Te6edf3raw Tff7b72= Tffa657strTb4b4b4(Te6edf3value Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Ta5d6ff:Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3rawTb4b4b4) Tff7b72!= T79c0ff32Tb4b4b4:
Tff7b72raise Te6edf3MapDataErrorTb4b4b4(Ta5d6ff"Ta5d6ffinvalid_destination_hashTa5d6ff"Tb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72return Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3rawTb4b4b4)
Tff7b72except Tf85149ValueError Tff7b72as Te6edf3excTb4b4b4:
Tff7b72raise Te6edf3MapDataErrorTb4b4b4(Ta5d6ff"Ta5d6ffinvalid_destination_hashTa5d6ff"Tb4b4b4) Tff7b72from T7ee787exc


Tff7b72def Td2a8ff_parse_bboxTb4b4b4(Te6edf3valueTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3value Tff7b72is Tff7b72None Tff7b72or Te6edf3value Tff7b72== Ta5d6ff"Ta5d6ff"Tb4b4b4:
Tff7b72return Tff7b72None
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3valueTb4b4b4, Tb4b4b4(Tffa657listTb4b4b4, Tffa657tupleTb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72return Tffa657listTb4b4b4(Te6edf3valueTb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3obj Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3valueTb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3objTb4b4b4, Tffa657listTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3obj
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72return Tff7b72None

Served by rngit 1.4.2 - Generated in 0.08s